package com.udi.project.business.utils.code;


import com.udi.project.business.pojo.damain.BarCodeEntity;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.ObjectUtils;
import org.krysalis.barcode4j.HumanReadablePlacement;
import org.krysalis.barcode4j.impl.code128.Code128Bean;
import org.krysalis.barcode4j.impl.datamatrix.DataMatrixBean;
import org.krysalis.barcode4j.output.bitmap.BitmapCanvasProvider;
import org.springframework.stereotype.Component;

import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

/**
 * @author Admin
 * 一维码二维码生成工具
 */
@Component
@Slf4j
public class BarCodeUtils {

    /**
     * 生成code128条形码
     *
     * @param height        条形码的高度
     * @param width         条形码的宽度
     * @param message       要生成的文本
     * @param withQuietZone 是否两边留白
     * @param hideText      隐藏可读文本
     * @return 图片对应的字节码
     *
     */
    public  byte[] generateBarCode128(BarCodeEntity barCodeEntity) throws IOException {
        Code128Bean bean = new Code128Bean();

        // 分辨率
        int dpi = 512;
        // 设置两侧是否留白
        bean.doQuietZone(barCodeEntity.isWithQuietZone());

        // 设置条形码高度和宽度
        /*bean.setBarHeight((double) ObjectUtils.defaultIfNull(barCodeEntity.getHeight(), 9.0D));
        if (barCodeEntity.getHeight() != null) {
            bean.setModuleWidth(barCodeEntity.getHeight());
        }*/
        // 设置文本位置（包括是否显示）
        if (barCodeEntity.isHideText()) {
            bean.setMsgPosition(HumanReadablePlacement.HRP_NONE);
        }
        // 设置图片类型
        String format = "image/png";


        ByteArrayOutputStream ous = new ByteArrayOutputStream();
        BitmapCanvasProvider canvas = new BitmapCanvasProvider(ous, format, dpi,
                BufferedImage.TYPE_BYTE_BINARY, false, 0);

        // 生产条形码
        bean.generateBarcode(canvas, barCodeEntity.getMessage());



        try {
            canvas.finish();
        } catch (IOException e) {

        }
        //图片是否写入本地
        if(barCodeEntity.isLocal()){
            File imageFile = new File("C:\\BarCode\\Code128");

            if(!imageFile.exists()){
                boolean fil = imageFile.mkdirs();
                if(!fil){
                    throw new IOException("文件创建失败");
                }
            }
            FileOutputStream fileOutputStream = new FileOutputStream("C:\\BarCode\\Code128\\test.png");
            byte[]  by = ous.toByteArray();
            for(byte b:by){
                fileOutputStream.write(b);
            }

            fileOutputStream.close();
        }
        return ous.toByteArray();
    }


    /**
     *
     * @Description: 生成DataMatrix二维码
     * @param code 生成条码文本
     * @param height 条形码的高度
     * @param width 条形码的宽度
     * @param withQuietZone 是否两边留白
     * @param hideText 隐藏可读文本
     * @return: byte[] 图片对应的字节码
     * @Date: 2021/7/30 17:40
     */
    public static byte[] getDataMarix(String code,Double height, Double width, boolean withQuietZone, boolean hideText) throws IOException {
        DataMatrixBean dataMatrixBean = new DataMatrixBean();
        // 分辨率
        int dpi = 512;
        //设置两侧空白
        dataMatrixBean.doQuietZone(withQuietZone);

        //设置二维码的宽高
        dataMatrixBean.setBarHeight((double) ObjectUtils.defaultIfNull(height, 9.0D));

        // 设置文本位置（包括是否显示）
        if (hideText) {
            dataMatrixBean.setMsgPosition(HumanReadablePlacement.HRP_NONE);
        }

        // 设置图片类型
        String format = "image/png";

        ByteArrayOutputStream ous = new ByteArrayOutputStream();
        BitmapCanvasProvider canvas = new BitmapCanvasProvider(ous, format, dpi,
                BufferedImage.TYPE_BYTE_BINARY, false, 0);

        //产生二维码
        dataMatrixBean.generateBarcode(canvas,code);

        try {
            canvas.finish();
        } catch (IOException e) {

        }
        return ous.toByteArray();

    }
}
